home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 431_01 / rifs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-01  |  2.6 KB  |  119 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dos.h>
  5.  
  6. #include "rifs.h"
  7.  
  8. static char **g_argv; /* argv[] as passed into main()  */
  9. static int    g_argc; /* argc   as passed into main()  */
  10. static int    g_argp; /* pointer to next argv[]        */
  11. static char  *g_arga; /* argument to last found option */
  12.  
  13. void ArgInit(int argc, char **argv)
  14. {
  15.   g_argv=argv;
  16.   g_argc=argc;
  17.   g_argp=1;
  18.   g_arga=NULL;
  19. }
  20.  
  21. void ArgError(char *err)
  22. {
  23.   fprintf(stderr, "%s\n", err);
  24.   exit(1);
  25. }
  26.  
  27. int GetOption(char **optionlist)
  28. {
  29.   int     ii;
  30.   char  *ptr,
  31.        **opt;
  32.   int    len;
  33.  
  34.   if (g_argp == g_argc)
  35.     return -1;
  36.  
  37.   for (ii=0, opt=optionlist; *opt; opt++, ii++) {
  38.     ptr = strchr(*opt, '=');
  39.     len = (ptr) ? (ptr-*opt) : strlen(*opt);
  40.     if (strnicmp(g_argv[g_argp], *opt, len) == 0)
  41.       break;
  42.   }
  43.   if (!*opt)
  44.     ArgError("option not recognized");
  45.   if (ptr) {
  46.     if (g_argv[g_argp][len]) {
  47.       if (g_argv[g_argp][len] != '=')
  48.         ArgError("syntax error");
  49.       else if (g_argv[g_argp][len+1]) {
  50.         g_arga=g_argv[g_argp]+len+1;
  51.         g_argp++;
  52.       } else if (++g_argp == g_argc)
  53.         ArgError("syntax error");
  54.       else
  55.         g_arga=g_argv[g_argp++];
  56.     } else {
  57.       g_argp++;
  58.       if ((g_argp == g_argc) || (g_argv[g_argp][0] != '='))
  59.         ArgError("syntax error");
  60.       else if (g_argv[g_argp][1]) {
  61.         g_arga=g_argv[g_argp]+1;
  62.         g_argp++;
  63.       } else if (++g_argp == g_argc)
  64.         ArgError("syntax error");
  65.       else {
  66.         g_arga=g_argv[g_argp];
  67.         g_argp++;
  68.       }
  69.     }
  70.   } else {
  71.     if (strlen(*opt) > strlen(g_argv[g_argp]))
  72.       ArgError("option not recognized(2)");
  73.     else
  74.       g_argp++;
  75.     g_arga=NULL;
  76.   }
  77.   return ii;
  78. }
  79.  
  80. /*
  81.   locate the RIFS interrupt in the range 0x60..0x66 OR 0x18
  82.   known by the signature "RIFS" in the four bytes preceding the
  83.   entry address.
  84.   return 0 if none found
  85. */
  86. static int dataddrs[]={0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x18};
  87.  
  88. int FindRIFS(void)
  89. {
  90.   char *sig;
  91.   int ii;
  92.  
  93.   for (ii=0; ii < sizeof(dataddrs); ii++) {
  94.     sig=*(char **) MK_FP(0x0, dataddrs[ii]*4);
  95.     if (sig && (FP_OFF(sig) > 4) && (memcmp(sig-4, "RIFS", 4) == 0))
  96.       return dataddrs[ii];
  97.   }
  98.   return 0;
  99. }
  100.  
  101. /*
  102.   return the first empty interrupt (points to 0:0)
  103.   0x60..0x66 OR 0x18. -1 if none found
  104. */
  105. int FindUnusedInt(void)
  106. {
  107.   int ii;
  108.  
  109.   for (ii=0; ii < sizeof(dataddrs); ii++)
  110.     if (*(char *) MK_FP(0x0, dataddrs[ii]*4) == 0)
  111.       return dataddrs[ii];
  112.   return 0;
  113. }
  114.  
  115. char *GetArg(void)
  116. {
  117.   return g_arga;
  118. }
  119.